package com.gitee.feizns.quickstart.domain.page;

import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 常规的页面数据结果
 * <p>
 *     page代表本次数据的分页信息<br/>
 *     records代表本次查询的数据
 * </p>
 * @author feizns
 * @since 2019/7/18
 */
public interface PageRecordsVo<T> {

    /**
     * 分页信息
     */
    PageVo getPage();

    /**
     * 数据
     */
    List<T> getRecords();

    /**
     * 将该{@link #getRecords()}中的数据做一次映射
     * @param mapper 映射函数
     * @return {@link PageRecordsVo}
     * @param <U> 返回类型
     */
    default <U> PageRecordsVo<U> map(Function<T, U> mapper) {
        return new DefaultPageRecordsVoImpl<>(getPage(), getRecords().stream().map(mapper).collect(Collectors.toList()));
    }

    /**
     * 空分页响应
     * @return {@link PageRecordsVo}
     * @param <T> 分页响应类型
     */
    static <T> PageRecordsVo<T> empty() {
        return new DefaultPageRecordsVoImpl<>(PageVo.empty(), Collections.emptyList());
    }

    /**
     * 空分页响应
     * @return {@link PageRecordsVo}
     * @param <T> 分页响应类型
     */
    static <T> PageRecordsVo<T> empty(PageAo page) {
        return new DefaultPageRecordsVoImpl<>(PageVo.empty(page), Collections.emptyList());
    }

}
